Skip to content

Springback UV map#

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['figure.dpi'] = 120

from cut_predictor import ProjectionPredictor
doe = pd.read_csv('../data/doe.csv')
doe.describe()
doe_id Material_ID Blechdicke Niederhalterkraft Ziehspalt Stempel_ID Einlegeposition Ziehtiefe Breite UG OG E Rp0 Rp0.2 Rp100 Rp25 Rp50
count 1000.000000 1000.000000 1000.000000 1000.00000 1000.00000 1000.000000 1000.000000 1000.000000 1000.00000 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000
mean 500.500000 3.866000 1.188370 251.12000 2.17280 2.716000 -0.422000 45.000000 70.65440 1.548120 1.809720 129.102675 209.942033 217.051735 481.885749 401.776216 442.422026
std 288.819436 1.637292 0.224187 147.00325 0.36093 0.451162 3.326708 16.591422 0.72186 0.257163 0.302279 58.332400 56.832894 54.073664 112.525169 61.073415 80.305188
min 1.000000 1.000000 0.990000 10.00000 1.60000 2.000000 -5.000000 30.000000 70.20000 1.140000 1.330000 71.681980 133.182632 147.101263 384.123147 369.820589 383.041834
25% 250.750000 3.000000 1.000000 120.00000 1.60000 2.000000 -3.250000 30.000000 70.20000 1.140000 1.330000 71.681980 138.226960 147.601859 384.123147 369.820589 383.041834
50% 500.500000 4.000000 1.010000 250.00000 2.40000 3.000000 -0.500000 40.000000 70.20000 1.710000 2.000000 118.282190 235.160326 237.951493 451.324586 374.608673 415.842304
75% 750.250000 5.000000 1.480000 380.00000 2.40000 3.000000 2.000000 55.000000 71.80000 1.710000 2.000000 191.372450 248.796491 251.315902 534.002871 385.773439 449.528189
max 1000.000000 6.000000 1.480000 500.00000 2.40000 3.000000 5.000000 70.000000 71.80000 1.710000 2.000000 200.038130 296.556500 306.211480 711.700600 556.006850 629.530400
data = pd.read_csv('../data/springback_uvmap.csv')
data.drop(data[data.doe_id == 1000].index, inplace=True)
data.drop(data[data.doe_id == 247].index, inplace=True)
data
doe_id u v x y z thickness epseqpl thinning
0 1 0.000000 0.000000 -132.603620 -117.544130 0.895656 1.000417 0.000823 0.990512
1 1 0.500000 0.019171 -0.000088 -87.060616 0.489975 0.991176 0.010210 0.981363
2 1 1.000000 0.036529 137.002380 -104.238950 0.742256 1.000619 0.001208 0.990712
3 1 1.000000 0.000000 132.603620 -117.544130 0.895656 1.000417 0.000823 0.990512
4 1 0.500000 0.000000 -0.000141 -95.070107 0.536487 0.992336 0.007779 0.982511
... ... ... ... ... ... ... ... ... ...
16721570 998 0.254233 0.654230 -89.967537 28.110500 35.537619 1.354696 0.277900 0.915335
16721571 998 0.255316 0.641760 -89.548157 28.170677 37.664772 1.345915 0.279300 0.909402
16721572 998 0.255497 0.628215 -89.451439 28.237469 39.968052 1.340451 0.279300 0.905710
16721573 998 0.254664 0.617541 -89.724800 28.299198 41.775429 1.393057 0.217900 0.941255
16721574 998 0.254648 0.605025 -89.672142 28.375393 43.917314 1.420526 0.182900 0.959815

16697652 rows × 9 columns

reg = ProjectionPredictor()
reg.load_data(
    doe = doe,
    data = data,
    index='doe_id',
    process_parameters = [
        'Blechdicke', 
        'Niederhalterkraft', 
        'Ziehspalt', 
        'Einlegeposition', 
        'Ziehtiefe',
        'Stempel_ID',
    ],
    categorical = [
        'Ziehspalt', 
        'Ziehtiefe',
        'Stempel_ID',
    ],
    position = ['u', 'v'],
    output = ['x', 'y', 'z'] ,#, 'thickness', 'epseqpl', 'thinning']
    validation_split=0.1,
    validation_method='leaveoneout'
)
reg.data_summary()
Data summary
------------------------------------------------------------

Process parameters:
    - Blechdicke : numerical [ 0.99  ...  1.48 ]
    - Niederhalterkraft : numerical [ 10  ...  500 ]
    - Ziehspalt : categorical [1.6, 2.4]
    - Einlegeposition : numerical [ -5  ...  5 ]
    - Ziehtiefe : categorical [30, 50, 70]
    - Stempel_ID : categorical [2, 3]
Input variables:
    - u : numerical, [ 0.0 / 1.0 ] 
    - v : numerical, [ 0.0 / 1.0 ] 
Output variable(s):
    - x : numerical, [ -202.42731 / 202.42731 ]
    - y : numerical, [ -118.32256 / 96.918961 ]
    - z : numerical, [ 0.0 / 73.213165 ]

Inputs (16697652, 12)
Outputs (16697652, 3)
Total number of experiments: 725
Total number of samples: 16697652
Number of training samples: 15037281
Number of test samples: 1660371
Number of experiments in the test set: 72

config = {
    'batch_size': 2048*16,
    'max_epochs': 50,
    'layers': [256, 256, 256, 256, 256],
    'dropout': 0.0,
    'learning_rate': 0.001,
    'activation': 'lrelu'
}

reg.custom_model(save_path='models/best_uv_model', config=config, verbose=True)
reg.training_summary()
Metal device set to: Apple M1 Pro

systemMemory: 16.00 GB
maxCacheSize: 5.33 GB

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 256)               3328      

 leaky_re_lu (LeakyReLU)     (None, 256)               0         

 dense_1 (Dense)             (None, 256)               65792     

 leaky_re_lu_1 (LeakyReLU)   (None, 256)               0         

 dense_2 (Dense)             (None, 256)               65792     

 leaky_re_lu_2 (LeakyReLU)   (None, 256)               0         

 dense_3 (Dense)             (None, 256)               65792     

 leaky_re_lu_3 (LeakyReLU)   (None, 256)               0         

 dense_4 (Dense)             (None, 256)               65792     

 leaky_re_lu_4 (LeakyReLU)   (None, 256)               0         

 dense_5 (Dense)             (None, 3)                 771       

=================================================================
Total params: 267,267
Trainable params: 267,267
Non-trainable params: 0
_________________________________________________________________
Epoch 1/50
459/459 [==============================] - 19s 40ms/step - loss: 0.0035 - val_loss: 9.6533e-05
Epoch 2/50
459/459 [==============================] - 18s 39ms/step - loss: 8.8049e-05 - val_loss: 6.6113e-05
Epoch 3/50
459/459 [==============================] - 18s 38ms/step - loss: 7.5220e-05 - val_loss: 3.2336e-04
Epoch 4/50
459/459 [==============================] - 18s 39ms/step - loss: 6.8558e-05 - val_loss: 4.6080e-05
Epoch 5/50
459/459 [==============================] - 18s 39ms/step - loss: 6.0042e-05 - val_loss: 3.5124e-05
Epoch 6/50
459/459 [==============================] - 18s 40ms/step - loss: 5.9036e-05 - val_loss: 6.3567e-05
Epoch 7/50
459/459 [==============================] - 18s 39ms/step - loss: 5.3332e-05 - val_loss: 3.1843e-05
Epoch 8/50
459/459 [==============================] - 18s 39ms/step - loss: 5.6049e-05 - val_loss: 3.5608e-05
Epoch 9/50
459/459 [==============================] - 19s 41ms/step - loss: 4.1115e-05 - val_loss: 1.2567e-04
Epoch 10/50
459/459 [==============================] - 18s 39ms/step - loss: 4.7044e-05 - val_loss: 2.6211e-05
Epoch 11/50
459/459 [==============================] - 18s 39ms/step - loss: 4.2628e-05 - val_loss: 8.0830e-05
Epoch 12/50
459/459 [==============================] - 18s 39ms/step - loss: 3.9800e-05 - val_loss: 2.3045e-05
Epoch 13/50
459/459 [==============================] - 18s 38ms/step - loss: 3.8004e-05 - val_loss: 1.5017e-04
Epoch 14/50
459/459 [==============================] - 18s 38ms/step - loss: 3.5721e-05 - val_loss: 2.1427e-05
Epoch 15/50
459/459 [==============================] - 18s 39ms/step - loss: 3.1986e-05 - val_loss: 3.6567e-05
Epoch 16/50
459/459 [==============================] - 18s 38ms/step - loss: 3.2717e-05 - val_loss: 5.3504e-05
Epoch 17/50
459/459 [==============================] - 18s 38ms/step - loss: 2.9897e-05 - val_loss: 2.0655e-05
Epoch 18/50
459/459 [==============================] - 18s 38ms/step - loss: 2.8404e-05 - val_loss: 2.6714e-05
Epoch 19/50
459/459 [==============================] - 18s 38ms/step - loss: 2.9446e-05 - val_loss: 1.9924e-05
Epoch 20/50
459/459 [==============================] - 18s 39ms/step - loss: 2.5951e-05 - val_loss: 1.7051e-05
Epoch 21/50
459/459 [==============================] - 21s 45ms/step - loss: 2.5611e-05 - val_loss: 1.6440e-05
Epoch 22/50
459/459 [==============================] - 19s 42ms/step - loss: 2.4814e-05 - val_loss: 2.2654e-05
Epoch 23/50
459/459 [==============================] - 18s 39ms/step - loss: 2.2382e-05 - val_loss: 1.8963e-05
Epoch 24/50
459/459 [==============================] - 18s 39ms/step - loss: 2.1886e-05 - val_loss: 4.2132e-05
Epoch 25/50
459/459 [==============================] - 18s 39ms/step - loss: 2.1513e-05 - val_loss: 1.7033e-05
Epoch 26/50
459/459 [==============================] - 18s 39ms/step - loss: 1.9479e-05 - val_loss: 2.0441e-05
Epoch 27/50
459/459 [==============================] - 18s 40ms/step - loss: 2.0390e-05 - val_loss: 2.5732e-05
Epoch 28/50
459/459 [==============================] - 18s 39ms/step - loss: 1.8972e-05 - val_loss: 2.3469e-05
Epoch 29/50
459/459 [==============================] - 18s 39ms/step - loss: 1.8269e-05 - val_loss: 2.4652e-05
Epoch 30/50
459/459 [==============================] - 17s 38ms/step - loss: 1.6638e-05 - val_loss: 3.6394e-05
Epoch 31/50
459/459 [==============================] - 18s 39ms/step - loss: 1.7830e-05 - val_loss: 1.6471e-05
Epoch 32/50
459/459 [==============================] - 17s 38ms/step - loss: 1.5533e-05 - val_loss: 4.0709e-05
Epoch 33/50
459/459 [==============================] - 17s 38ms/step - loss: 1.5860e-05 - val_loss: 1.9261e-05
Epoch 34/50
459/459 [==============================] - 17s 38ms/step - loss: 1.6034e-05 - val_loss: 5.9389e-05
Epoch 35/50
459/459 [==============================] - 18s 39ms/step - loss: 1.5285e-05 - val_loss: 1.3749e-05
Epoch 36/50
459/459 [==============================] - 17s 38ms/step - loss: 1.5239e-05 - val_loss: 1.2749e-05
Epoch 37/50
459/459 [==============================] - 18s 40ms/step - loss: 1.5157e-05 - val_loss: 1.7114e-05
Epoch 38/50
459/459 [==============================] - 18s 39ms/step - loss: 1.2999e-05 - val_loss: 1.6996e-05
Epoch 39/50
459/459 [==============================] - 18s 39ms/step - loss: 1.3645e-05 - val_loss: 1.7193e-05
Epoch 40/50
459/459 [==============================] - 18s 39ms/step - loss: 1.3452e-05 - val_loss: 1.5187e-05
Epoch 41/50
459/459 [==============================] - 18s 39ms/step - loss: 1.3526e-05 - val_loss: 2.5575e-05
Epoch 42/50
459/459 [==============================] - 18s 40ms/step - loss: 1.2672e-05 - val_loss: 1.2135e-05
Epoch 43/50
459/459 [==============================] - 18s 38ms/step - loss: 1.2901e-05 - val_loss: 1.6611e-05
Epoch 44/50
459/459 [==============================] - 17s 38ms/step - loss: 1.2735e-05 - val_loss: 1.3362e-05
Epoch 45/50
459/459 [==============================] - 18s 40ms/step - loss: 1.1466e-05 - val_loss: 6.7970e-05
Epoch 46/50
459/459 [==============================] - 18s 38ms/step - loss: 1.2104e-05 - val_loss: 4.0869e-05
Epoch 47/50
459/459 [==============================] - 18s 40ms/step - loss: 1.1756e-05 - val_loss: 1.3876e-05
Epoch 48/50
459/459 [==============================] - 18s 40ms/step - loss: 1.1365e-05 - val_loss: 1.1713e-05
Epoch 49/50
459/459 [==============================] - 18s 39ms/step - loss: 1.1296e-05 - val_loss: 4.6768e-05
Epoch 50/50
459/459 [==============================] - 18s 38ms/step - loss: 1.1939e-05 - val_loss: 1.7391e-05
51/51 [==============================] - 1s 14ms/step - loss: 1.1713e-05
INFO:tensorflow:Assets written to: models/best_uv_model/assets
Validation mse: 1.1713131243595853e-05

reg.load_network('models/best_uv_model')
Metal device set to: Apple M1 Pro

systemMemory: 16.00 GB
maxCacheSize: 5.33 GB


idx = np.random.choice(data['doe_id'].unique()) 
print("Doe_ID", idx)
reg.compare(idx)
Doe_ID 604

import plotly
import plotly.graph_objs as go
plotly.offline.init_notebook_mode()

def plotly_show_surface(x, y):
    # Configure the trace.
    trace = go.Scatter3d(
        x=y[0, :, :].flatten(),  
        y=y[1, :, :].flatten(),
        z=y[2, :, :].flatten(),
        mode='markers',
        marker={
            'size': 0.2,
            'opacity': 0.8,
        }
    )

    # Configure the layout.
    layout = go.Layout(
        margin={'l': 0, 'r': 0, 'b': 0, 't': 0}
    )

    data = [trace]

    plot_figure = go.Figure(data=data, layout=layout)

    # Render the plot.
    plotly.offline.iplot(plot_figure)


%matplotlib inline
plt.rcParams['figure.dpi'] = 150

def mpl_show_surface(x, y):

    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    p = ax.scatter(
        y[0, :, :].flatten(),  
        y[1, :, :].flatten(),
        y[2, :, :].flatten(),
        s=0.001
    )
x, y = reg.predict({
        'Blechdicke': 1.01, 
        'Niederhalterkraft': 410.0, 
        'Ziehspalt': 2.4, 
        'Einlegeposition': -5, 
        'Ziehtiefe': 30,
        'Stempel_ID': 3,
        'E': 191.37245,
        'Rp0': 138.22696,
        'Rp50': 449.528189,
    }, 
    shape=(500, 500))

plotly_show_surface(x, y)
reg.interactive(mpl_show_surface, positions=(500, 500))
interactive(children=(FloatSlider(value=1.1883700000000001, description='Blechdicke', max=1.48, min=0.99, step…